import re

from bs4 import BeautifulSoup

html = """<div class="panel">
<div class="panel-heading">
<h4>Hello</h4>
</div>
<div class="panel-body">
<ul class="list" id="list-1">
<li class="element">Foo</li>
<li class="element">Bar</li>
<li class="element">Jay</li>
</ul>
<ul class="list list-small" id="list-2">
<li class="element">Foo</li>
<li class="element" name="element">Bar</li>
</ul>
</div>
</div>
"""
# 方法选择器
soup = BeautifulSoup(html, 'lxml')
# find_all 方法传入 name 参数，根据节点名来查询元素
# find_all 是查询所有符合条件的元素。给它传入一些属性或文本，就可以得到符合条件的元素
# find_all(name , attrs , recursive , text , **kwargs)
ul = soup.find_all(name='ul')  # 使用name参数查询
for u in ul:
    print('ul标签id属性：', u.attrs['id'])
    for li in u.find_all('li'):
        print('        li标签：', li.string)
# 使用attrs查询
attrs_id = soup.find_all(attrs={'id': 'list-1'})
print('使用attrs查询id=list-1的')
print(attrs_id)
attrs_element = soup.find_all(attrs={'name': 'element'})
print('使用attrs查询name=attrs_element的')
print(attrs_element)
# 对于一些常用的属性，比如 id 和 class 等，可以不用 attrs 来传递。比如，要查询id 为list-1 的节点，可以直接传入 id 这个参数
attrs_id = soup.find_all(id='list-1')
print('使用attrs查询id=list-1的')
print(attrs_id)
attrs_element = soup.find_all(class_='element')
print('使用attrs查询class_=element的')
print(attrs_element)
# find_all 方法根据文本来查询
text_bar = soup.find_all(string=re.compile('Bar'))
print('根据文本来查询')
print(text_bar)
# 除了 find_all()方法，还有 find()方法，不过后者返回的是单个元素，也就是第一个匹配的元素，而前者返回的是所有匹配的元素组成的列表
print('find()'.center(50, '='))
print(soup.find(name='ul'))

# CSS 选择器的使用
print('CSS 选择器的使用'.center(100, '-'))
# 使用CSS 选择器时，只需要调用 select()方法，传入相应的 CSS 选择器即可
c_element = soup.select('#list-2 .element')
print('选择id=list-2下class= element的内容')
print(c_element)
